﻿#define  _CRT_SECURE_NO_WARNINGS 1
//
//#include <stdio.h>
//int main()
//{
//	int a = 0;
//	char b = 0;
//
//	int* pa = &a;
//	char* pb = &b;
//
//	printf("&a   = %p\n", pa);
//	printf("pa+1 = %p\n", pa + 1);
//	printf("pa-1 = %p\n", pa - 1);
//
//	printf("\n\n");
//
//	printf("&b   = %p\n", pb);
//	printf("pb+1 = %p\n", pb + 1);
//	printf("pb-1 = %p\n", pb - 1);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	int* pa = &a;
//
//	char* pc = &a;
//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//    const int n = 0;
//    printf("n = %d\n", n);
//    int* p = &n;
//    *p = 20;
//    printf("n = %d\n", n);
//    return 0;
//}

//#include <stdio.h>
////代码1
//void test1()
//{
//	int n = 10;
//	int m = 20;
//	int* p = &n;
//	*p = 20;//ok?
//	p = &m; //ok?
//}
//void test2()
//{
//	//代码2
//	int n = 10;
//	int m = 20;
//	const int* p = &n;
//	*p = 20;//ok?
//	p = &m; //ok?
//}
//void test3()
//{
//	int n = 10;
//	int m = 20;
//	int* const p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//void test4()
//{
//	int n = 10;
//	int m = 20;
//	int const* const p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//int main()
//{
//	//测试⽆const修饰的情况
//	test1();
//	//测试const放在*的左边情况
//	test2();
//	//测试const放在*的右边情况
//	test3();
//	//测试*的左右两边都有const
//	test4();
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	printf("sizeof(\"123\") = %zd \n",sizeof("123"));
//	printf("sizeof(\"AB\\tC\") = %zd \n", sizeof("AB\tC"));
//	printf("sizeof(\"abc\\0def\") = %zd \n", sizeof("abc\0def"));
//	return 0;
//}

//大写转小写
//#include <stdio.h>
//#include <ctype.h>
//int main()
//{
//	char str[] = "THE STRING.\n";
//	char ch = 0;
//	int i = 0;
//	while (str[i])
//	{
//		ch = str[i];
//		if (isupper(ch))
//		{
//			ch = ch + 32;
//		}
//		putchar(ch);
//		i++;
//	}
//
//	return 0;
//}

//#include <stdio.h>
//#include <ctype.h>
//
//
//int main()
//{
//	char str[] = "THE STRING.\n";
//	char ch = 0;
//	int i = 0;
//	while (str[i])//当是\0时就终止
//	{
//		ch = str[i];
//		if (isupper(ch))//判断是否为大写。
//		{
//			ch = tolower(ch);//将大写转化为小写，需要将大写字母加32
//		}
//		putchar(ch);//输出每一次的值
//		i++;
//	}
//	return 0;
//}

//strlen的实现
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//size_t my_strlen(const char* str)//因为不需要修改str的本身所以我们用const修饰。
//{
//	assert(str);//不可能给一个空指针给这个函数计算，不安全
//	size_t count = 0;//创建中间变量来计算 
//	while (*str != '\0')//从第一个开始判断，是'\0'就不进入循环
//	{
//		count++;
//		str++;
//	}
//	return count;//返回一个size_t的值
//}
//
//int main()
//{
//	char str[] = "Holle World!";
//	
//	size_t ret = my_strlen(str);//因为strlen返回的是size_t的类型
//
//	printf("str 有%d个字符\n", ret);
//
//	return 0;
//}
//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//size_t my_strlen(const char* str)//因为不需要修改str的本身所以我们用const修饰。
//{
//	assert(str);//不可能给一个空指针给这个函数计算，不安全
//	char* start = str;//记录下起始指针
//	while (*str != '\0')//从第一个开始判断，是'\0'就不进入循环
//	{
//		str++;
//	}
//	return (size_t)(str - start);//返回一个size_t的值
//}
//
//int main()
//{
//	char str[] = "Holle World!";
//
//	size_t ret = my_strlen(str);//因为strlen返回的是size_t的类型
//
//	printf("str 有%d个字符\n", ret);
//
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//size_t my_strlen(const char* str)//因为不需要修改str的本身所以我们用const修饰。
//{
//	assert(str);//不可能给一个空指针给这个函数计算，不安全
//	if (*str == 0)
//		return 0;
//	else
//		return (size_t)(1 + my_strlen(str + 1));//返回一个size_t的值
//}
//
//int main()
//{
//	char str[] = "Holle World!";
//
//	size_t ret = my_strlen(str);//因为strlen返回的是size_t的类型
//
//	printf("str 有%d个字符\n", ret);
//
//	return 0;
//}

//strcpy的模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcpy(char* dest,const char* src)
{
	char* start = dest;//记录起始地址好返回该地址
	assert(dest && src);//保证表不是空指针
	while (*src != '\0')//不是'\0'开始，依次赋值再++;
	{
		*dest = *src;
		dest++;
		src++;
	}
	if(*src == '\0')//因为strlen会将\0也复制进去所以我们需要将特殊情况考虑进去
	{
		*dest = *src;
	}
	/*while (*dest++ = *src++)//这样写也可以，先算=右边的值因为后置++先使用再++
		;*/
	return start;
}

int main()
{
	char arr1[20] = "##########";
	char arr2[] = "abcdef";

	char* ret = my_strcpy(arr1, arr2);

	printf("%s\n", ret);

	return 0;
}